package ai.exemples;

import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.basic.BasicMLData;
import org.encog.ml.data.basic.BasicMLDataPair;

import ai.parser.ImageParser;
import ai.parser.LabelParser;

public class MLDataPairFactory {
	
	/** Le nom fichier d'image */
	private String imagesFile;
	
	/** Le nom du fichier de label */
	private String labelsFile;
	
	/** Le parser pour les images */
	private ImageParser imageParser;
	
	/** Le parser pour les labels */
	private LabelParser labelParser;

	public MLDataPairFactory(String imagesFile, String labelsFile) {
		super();
		this.imagesFile = imagesFile;
		this.labelsFile = labelsFile;
		this.imageParser = new ImageParser(imagesFile);
		this.labelParser = new LabelParser(labelsFile);
		imageParser.open();
		labelParser.open();
	}
	
	/**
	 * Créer une pair à partir des fichiers
	 * @return un objet pair si un est dispo, null sinon
	 */
	public MLDataPair getPair() {
		try {
			/** Construir le MLData pour les entrées */
			MLData input = new BasicMLData(imageParser.loadImage());
			
			/**
			 * Construir le MLData pour les sortie. 
			 * Tableau de double avec que des 0.0 sauf un 1.0 pour la case avec l'index correspondant au label
			 */
			double label = labelParser.loadLabel(); 
			double[] rawOutput = new double[10];
			for (int i=0; i < rawOutput.length; i++)
				rawOutput[i] = ((i==label)?1.0:0.0);
            MLData output = new BasicMLData(rawOutput);
            
            return (new BasicMLDataPair(input, output)); 
		} catch (Exception e) {
			labelParser.close();
			imageParser.close();
			return null;
		}		
	}
	
	public void destroy() {
		labelParser.close();
		imageParser.close();
	}

	public String getImagesFile() {
		return imagesFile;
	}

	public void setImagesFile(String imagesFile) {
		this.imagesFile = imagesFile;
	}

	public String getLabelsFile() {
		return labelsFile;
	}

	public void setLabelsFile(String labelsFile) {
		this.labelsFile = labelsFile;
	}
	
	

}
